#ifndef SQLPOOL_H_
#define SQLPOOL_H_

#include <mysql/mysql.h>
#include "virtual_file.h"

#define IP_LEN      15
#define DBNAME_LEN  64
#define DBUSER_LEN  64
#define PASSWD_LEN  64
#define POOL_MAX_NUMBER 20



typedef enum{
    DB_DISCONN, 
    DB_CONN
}sql_status;

/*连接节点*/
typedef struct _SQL_NODE{
  MYSQL            fd;                  /* mysql对象文件描述符 */
  MYSQL            *mysql_sock;         /* 指向已经连接的MYSQL的指针 */
  pthread_mutex_t  lock;                /* 互斥锁*/
  int              used;                /* 使用标志:1表示在使用，0 */
  int              index;               /* 下标 */
  sql_status       sql_state;                        /* 数据库连接状态 */

}SQL_NODE;

/*连接池*/
typedef struct _SQL_CONN_POOL{
    int        shutdown;                   /*是否关闭*/
    SQL_NODE   sql_pool[POOL_MAX_NUMBER];  /* 连接端口 */
    int        pool_number;                /* 连接数量 */
    int        busy_number;                /*被获取的连接数量*/
    char       ip[IP_LEN+1];               /* 数据库的ip */
    int        port;                       /* 数据库的port,一般是3306 */
    char       db_name[DBNAME_LEN+1];      /* 数据库的名字 */
    char       user[DBUSER_LEN+1];         /* 用户名 */
    char       passwd[PASSWD_LEN+1];       /* 密码 */
}SQL_CONN_POOL;

/*创建连接池*/
SQL_CONN_POOL *sql_pool_create(int connect_pool_number, const char ip[], int port, 
                               const char db_name[], const char user[], const char passwd[]);
/*节点创建连接*/
int create_db_connect(SQL_CONN_POOL *sp, SQL_NODE *node);

/*销毁连接池*/
void sql_pool_destroy(SQL_CONN_POOL *sp);

/*取出一个未使用的连接*/
SQL_NODE *get_db_connect(SQL_CONN_POOL *sp);

/*归回连接*/
void release_node(SQL_CONN_POOL *sp, SQL_NODE *node);

/*用户注册插入数据*/
int  mysql_insert(SQL_CONN_POOL *sp, const char* name, const char* salt, 
                  const char* cryptpasswd, const char* pwd);

/*查询salt值 */
int mysql_select_salt(SQL_CONN_POOL *sp, const char* username, char* result);

/*查询cryptpasswd值 */
int mysql_select_crypt(SQL_CONN_POOL *sp, const char* username, char* result);

/*查询该用户当前位于目录id*/
int mysql_select_pwd(SQL_CONN_POOL *sp, const char* username, int* uid, int* path_id);

/*更新pwd(目录)*/
int mysql_update_pwd(SQL_CONN_POOL *sp, const char* name, const char* pwd);

//判断用户名是否存在
int isUser(SQL_CONN_POOL *sp, const char* name);

/*登录查询用户信息*/
int login_getfile(SQL_CONN_POOL* sp, const char* name, file_t* file);

/*获取当前目录的id 作为创建新目录或文件的parent_id*/
int mkdir_get_dir_id(SQL_CONN_POOL* sp, const char* owner, int* uid, int* path_id);
/*获取当前位置完整路径pwd*/                                                                                                        
int get_pwd(SQL_CONN_POOL* sp, const int vfb_id, const int owner_id, char* pwd);

/*往virtual_file中插值*/
int insert_virtual_file(SQL_CONN_POOL* sp, const int parent_id, const char* filename, const int owner_id,
                                      const char* hash_val, const int filesize, const char type, char* path);

/*判断virtual_file表中是否存在该文件*/
int isExist_virtual_file(SQL_CONN_POOL* sp, const char* filename, const int parent_id, const int owner_id, const char type); 
/*cd 目录切换，update，user_info中的path_id*/
/*cd 目录切换，update，user_info中的path_id*/
int cd_dir(SQL_CONN_POOL* sp, const int parent_id, const int uid, const char* filename);
/*判断当前目录是否是根目录*/
int isRoot(SQL_CONN_POOL* sp, const int uid, const int path_id, int* parent_id);
/*cd: 目录返回*/
int re_dir(SQL_CONN_POOL* sp, const int parent_id, const int uid);
 /*插入global_file*/
int insert_global_file(SQL_CONN_POOL* sp, const char* file_hash, const char* file_name, const int filesize);

/*判断服务器是否存在该文件--查询global_file*/
int isExist_file(SQL_CONN_POOL* sp, const char* file_hash); 

/*ls--当前目录下所有的文件*/
int get_ls(SQL_CONN_POOL* sp, const int parent_id, const int owner_id, char* result); 

#endif
